#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>

/**
 * @brief HTTP文件下载器类
 * 提供基础的HTTP文件下载功能，支持进度显示和错误处理
 */
class HttpDownload : public QObject
{
    Q_OBJECT

public:
    explicit HttpDownload(QObject* parent = nullptr);
    ~HttpDownload();

    /**
     * @brief 开始下载文件
     * @param url 下载文件的URL地址
     * @param filePath 本地保存路径
     */
    void startDownload(const QUrl& url, const QString& filePath);

    /**
     * @brief 暂停下载（如果支持断点续传）
     */
    void pauseDownload();

    /**
     * @brief 继续下载（如果支持断点续传）
     */
    void resumeDownload();

    /**
     * @brief 取消下载
     */
    void cancelDownload();

    /**
     * @brief 获取当前下载状态
     * @return 下载状态字符串
     */
    QString getDownloadState() const;

signals:
    /**
     * @brief 下载进度信号
     * @param bytesReceived 已接收字节数
     * @param bytesTotal 总字节数
     */
    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);

    /**
     * @brief 下载完成信号
     * @param filePath 下载完成的文件路径
     */
    void downloadFinished(const QString& filePath);

    /**
     * @brief 下载错误信号
     * @param errorString 错误描述
     */
    void downloadError(const QString& errorString);

    /**
     * @brief 下载状态改变信号
     * @param state 新的下载状态
     */
    void stateChanged(const QString& state);

private slots:
    /**
     * @brief 网络请求完成槽函数
     */
    void onReplyFinished();

    /**
     * @brief 下载进度更新槽函数
     * @param bytesReceived 已接收字节数
     * @param bytesTotal 总字节数
     */
    void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);

    /**
     * @brief 准备读取响应数据槽函数
     */
    void onReadyRead();

    /**
     * @brief 网络错误处理槽函数
     * @param error 错误代码
     */
    void onNetworkError(QNetworkReply::NetworkError error);

private:
    /**
     * @brief 初始化网络管理器
     */
    void initNetworkManager();

    /**
     * @brief 清理网络回复对象
     */
    void cleanupReply();

    /**
     * @brief 设置下载状态
     * @param state 新的状态
     */
    void setState(const QString& state);


    // 网络访问管理器，用于处理HTTP请求
    QNetworkAccessManager* m_networkManager;

    // 网络回复对象，表示当前的下载请求
    QNetworkReply* m_reply;

    // 本地文件对象，用于保存下载的数据
    QFile* m_file;

    // 下载的URL地址
    QUrl m_downloadUrl;

    // 本地保存路径
    QString m_saveFilePath;

    // 当前下载状态
    QString m_currentState;

    // 是否用户取消下载
    bool m_isUserCanceled;
};

#endif // HTTPDOWNLOAD_H